/*
 * Auto.cpp
 *
 *  Created on: 02/10/2012
 */

#include "Auto.h"

Auto::Auto(int horasEstacionado):
	horasEstacionado (horasEstacionado){
	Log::getInstance()->loguear("Auto: creado.");
}

Auto::~Auto() {
	Log::getInstance()->loguear("Auto: destruido.");
}

void Auto::inicializar(){
	this->bloquearSeniales();
}

/**
 * Metodo que define que las señales SIGINT y SIGTERM se bloquean.
 * El objetivo es que el auto no salga del sleep para manejar estas señales.
 * Las señales SIGINT y SIGTERM las agarra el terminador para finalizar
 * la ejecución correctamente.
 */
void Auto::bloquearSeniales(){
	sigset_t set;
	sigemptyset(&set);
	sigaddset(&set, SIGINT);
	sigaddset(&set, SIGTERM);
	sigprocmask(SIG_BLOCK, &set, NULL);
}

int Auto::getHorasEstacionado() const {
	return horasEstacionado;
}

void Auto::setHorasEstacionado(int horasEstacionado) {
	this->horasEstacionado = horasEstacionado;
}

Ticket Auto::getTicket() const {
	return ticket;
}

void Auto::setTicket(Ticket ticket) {
	this->ticket = ticket;
}

/**
 * Duerme el proceso del auto hasta que sea momento para salir del estacionamiento.
 */
void Auto::estacionar(){
	Log::getInstance()->loguear("Auto: me duermo " + intToString(horasEstacionado) + " segundos.");

	sleep(this->horasEstacionado);
	this->salir();
}

/**
 * Envia el ticket por la cola de mensajes a una salida elegida por el auto.
 */
void Auto::salir(){
	Cola<MensajeTicket> colaSalir((char*)ARCHIVO_COLAS_SALIDAS, this->ticket.getNumeroEstacionamiento());
	MensajeTicket mensaje;
	mensaje.mtype = this->seleccionarSalida() + 1; // El +1 es para que el mtype no sea cero.
	mensaje.ticket = this->ticket;
	colaSalir.escribir(mensaje);
}

int Auto::seleccionarSalida(){
	return this->ticket.getLugarOcupado() % CANTIDAD_SALIDAS;
}
